package permission

import (
	"errors"
	"fmt"
	"strings"
	"time"

	"gorm.io/gorm"
	"tupu-go/model"
	"tupu-go/pkg/database"
	"tupu-go/pkg/encrypt"
	"tupu-go/pkg/jwt"
)

// 全局数据库实例

// ------------------------------ 用户权限相关 ------------------------------

// ParseUserToken 解析用户token，获取用户ID
func ParseUserToken(token string) (int, error) {
	// 调用JWT工具解析token（假设JWT payload中包含"user_id"字段）
	claims, err := jwt.ParseToken(token)
	if err != nil {
		return 0, fmt.Errorf("token解析失败: %w", err)
	}
	fmt.Println(claims["user_id"], claims["username"])

	userID, ok := claims["user_id"]
	if ok {
		if floatID, ok := userID.(float64); ok {
			return int(floatID), nil
		}
		return 0, errors.New("token中用户ID不是整数")

	}

	return 0, errors.New("token中未包含有效的用户ID")
}

// GetUserPermission 获取用户权限信息
// GetUserPermission 获取用户权限信息
func GetUserPermission(userID int) (*model.Permission, error) {
	var db = database.GetDB()
	// 检查 db 是否为 nil
	if db == nil {
		return nil, errors.New("数据库实例未初始化")
	}
	var permission model.Permission
	if err := db.
		Where("employee_id = ?", userID).
		First(&permission).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.New("用户无权限配置")
		}
		return nil, fmt.Errorf("数据库查询失败: %w", err)
	}
	return &permission, nil
}

// IsTaskOwner 检查用户是否为任务的创建者（普通用户/半超管操作权限校验）
func IsTaskOwner(userID, taskID string) bool {
	var db = database.GetDB()
	var task model.Task
	if err := db.
		Where("task_code = ? AND creator_id = ?", taskID, userID).
		First(&task).Error; err != nil {
		return false
	}
	return true
}

// ------------------------------ 第三方密钥权限相关 ------------------------------

// ParseThirdPartyKey 解析第三方密钥，提取keyID和关联的taskID
func ParseThirdPartyKey(key string) (keyID, taskID string, err error) {
	// 假设密钥格式为"keyID|taskID|signature"，解密后解析
	decryptedKey, err := encrypt.AesDecrypt(key)
	if err != nil {
		return "", "", fmt.Errorf("密钥解密失败: %w", err)
	}
	parts := strings.Split(decryptedKey, "|")
	if len(parts) != 3 {
		return "", "", errors.New("密钥格式错误")
	}
	return parts[0], parts[1], nil
}

// GetKeyPermission 获取第三方密钥权限信息
func GetKeyPermission(keyID string) (*model.KeyPermission, error) {
	var db = database.GetDB()
	var keyPerm model.KeyPermission
	if err := db.
		Where("key_id = ?", keyID).
		First(&keyPerm).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.New("密钥不存在")
		}
		return nil, fmt.Errorf("数据库查询失败: %w", err)
	}
	return &keyPerm, nil
}

// GenerateThirdPartyKey 生成第三方对接密钥（创建第三方权限时调用）
func GenerateThirdPartyKey(taskID, thirdPartyName, scope string) (string, error) {
	var db = database.GetDB()
	// 生成唯一keyID
	keyID := fmt.Sprintf("key_%s", time.Now().Format("20060102150405"))
	// 生成原始密钥（格式：keyID|taskID|timestamp）
	rawKey := fmt.Sprintf("%s|%s|%d", keyID, taskID, time.Now().Unix())
	// AES加密密钥
	encryptedKey, err := encrypt.AesEncrypt(rawKey)
	if err != nil {
		return "", fmt.Errorf("密钥加密失败: %w", err)
	}
	// 保存密钥权限到数据库
	keyPerm := model.KeyPermission{
		KeyID:           keyID,
		TaskID:          taskID,
		ThirdPartyName:  thirdPartyName,
		KeyValue:        encryptedKey,
		PermissionScope: scope,
		Status:          true, // 默认启用
	}
	if err := db.Create(&keyPerm).Error; err != nil {
		return "", fmt.Errorf("密钥保存失败: %w", err)
	}
	return encryptedKey, nil
}

// ------------------------------ 辅助工具函数 ------------------------------

// CheckPermissionScope 检查第三方权限范围是否允许操作（辅助中间件校验）
func CheckPermissionScope(scope, method string) bool {
	switch scope {
	case "read":
		return method == "GET"
	case "write":
		return method == "GET" || method == "POST" || method == "PUT"
	case "operate":
		return method != "DELETE" // 禁止删除操作
	default:
		return false
	}
}
